package dbgorm

import (
	"sync"

	"gorm.io/gorm"
)

// 本地驱动信息存储，以及对应的lock锁
var _default_dervice map[string]func(dsn string) gorm.Dialector = map[string]func(dsn string) gorm.Dialector{}
var _default_dervice_lock sync.Mutex

// 设置数据库驱动信息
// 如：连接MySQL数据库：dbgorm.SetDervice("mysql",mysql.Open)
// 如果数据库驱动已存在的话，此处会直接跳过本次设置
//
//	name	驱动名称
//	fun		驱动打开函数
func SetDervice(name string, fun func(dsn string) gorm.Dialector) {
	if _, ok := _default_dervice[name]; ok {
		// 如果驱动已存在则直接跳过本次插入
		return
	}
	_default_dervice_lock.Lock()
	defer _default_dervice_lock.Unlock()
	_default_dervice[name] = fun
}

// 设置数据库驱动信息
// 如：连接MySQL数据库：dbgorm.SetDervices(mysql.Open)
// 如果数据库驱动已存在的话，此处会直接跳过本次设置
//
//	fun		驱动打开函数
func SetDervices(fun ...func(dsn string) gorm.Dialector) {
	_default_dervice_lock.Lock()
	defer _default_dervice_lock.Unlock()
	for i := 0; i < len(fun); i++ {
		name := fun[i]("").Name()
		_default_dervice[name] = fun[i]
	}
}

// 设置数据库驱动信息
// 如：连接MySQL数据库：dbgorm.SetDervice("mysql",mysql.Open)
// 此操作为强制设置驱动，如果没有则会进行设置，如果有则会进行替换
//
//	name	驱动名称
//	fun		驱动打开函数
func ReplaceDervice(name string, fun func(dsn string) gorm.Dialector) {
	_default_dervice_lock.Lock()
	defer _default_dervice_lock.Unlock()
	_default_dervice[name] = fun
}

// 获取已设置的数据库驱动列表
func GetDerviceName() []string {
	dervice_name := []string{}
	for i, _ := range _default_dervice {
		dervice_name = append(dervice_name, i)
	}
	return dervice_name
}

// 判断某驱动名称是否已设置
//
//	name	驱动名称
func HasDervice(name string) bool {
	if _, ok := _default_dervice[name]; ok {
		return true
	}
	return false
}
